#include<iostream>
#include<string>
using namespace std;
struct node
{
    string name;
    int score;
    node* next;
};
node* creatList(); // 创建了一个返回值为指向数据类型为node的执政,即返回的是一个地址
int main()
{
    node* head=creatList();
}
node* creatList()
{
    node* head = new node; // 通过new 创建了一个数据类型为node的数据 并把该数据的地址赋值给node
    node* p= new node; // 再创建一个数据类型为node的数据 并把该数据的地址赋值给node
    p=head; // 把head 里面的地址赋值给p
    p->next=NULL; //这里把p指向的数据类型为node的数据里的 指针next指向了空.指针必须有对象 即指向一个地方,你不告诉它 它就乱跑 所以一般都是让它空着
    while (true) // 这里我选择while循环 因为里面是true 所以会一直进行 ,我们在里面使用条件判断加break跳出来
    {
        cout<<"Please enter student name: ";
        cin>>p->name; // 录入学生的姓名
        cout<<"Please enter student score: ";
        cin>>p->score; // 输入学生的分数
        if(p->score <0){
            break; // 如果分数小于0 跳出循环即输入结束.
        }
        node*q =new node; // 没有跳出循环 即继续输入,这时我们再创建一个这些数据类型为node的数据 并把它的地址赋值给 指针变量 q .
        p->next=q; // 刚刚p指针指向的数据类型为node的数据里的 指针next 指向 q ,节点p 和 节点q连起来了..
        q->next=NULL; // 指针q指向的数据类型为node的数据里的指针 next 指针也不能乱指,所以我们让它指向 NULL
        p=q; // 这里我当初就搞了很长时间.还记的嘛 p 和 q 是什么 ,它们两都是指针变量.它们里面放的是地址,而且它们里面的地址是可以给其它的指向相同数据类型的指针的,这里我们把q里面的地址 给了p 这样p里面存放的地址就是这个链表的最后一个节点的地址.如此反复我们就实现了动态输入.
    }
    return head; // 这就是为什么我们要设置head了,因为p的地址是不断变化的,而head里面的地址是不变的.而且head里面放的就是第一个节点的地址,
}